﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using AgileSaude.Entities;
using AgileSaude.Business;
using System.Reflection;

namespace AgileSaude.Web.Compras
{
    public partial class ComprarExame : PageBase
    {
        public int IdMedico
        {
            get { return Convert.ToInt32(Session["IdMedico"]); }
            set { Session["IdMedico"] = value; }
        }

        public int IdTipoServico
        {
            get { return Convert.ToInt32(Session["IdTipoServico"]); }
            set { Session["IdTipoServico"] = value; }
        }
        
        public decimal ValorTotal
        {
            get { return Convert.ToDecimal(Session["ValorTotal"]); }
            set { Session["ValorTotal"] = value; }
        }

        public List<Servico_MedicoEntities> Servicos
        {
            get { return (List<Servico_MedicoEntities>)Session["Servicos"]; }
            set { Session["Servicos"] = value; }
        }

        private string sortExpression
        {
            get { return ViewState["sortExpression"].ToString(); }
            set { ViewState["sortExpression"] = value; }
        }

        private int sortDirection
        {
            get { return Convert.ToInt32(ViewState["sortDirection"]); }
            set { ViewState["sortDirection"] = value; }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                this.sortExpression = "NomeServico";
                this.sortDirection = 1;

                if (Request.QueryString["Tipo"] != null)
                    IdTipoServico = int.Parse(Request.QueryString["Tipo"]);

                Resultado resultado = new Resultado();

                CidadeEntities FiltroCidade = new CidadeEntities();

                ddlCidade.DataTextField = "Nome";
                ddlCidade.DataValueField = "IdCidade";

                ddlCidade.DataSource = new CidadeFacade().Listar(FiltroCidade, ref resultado).OrderBy(x => x.Nome);
                ddlCidade.DataBind();

                ddlCidade.Items.Insert(0, "");
            }
        }

        protected void ddlCidade_OnSelectedIndexChanged(Object sender, EventArgs e)
        {
            lblExames.Visible = false;
            gvExames.Visible = false;

            if (ddlCidade.SelectedValue != "")
            {
                Resultado resultado = new Resultado();

                int codigo;

                if (!int.TryParse(ddlCidade.SelectedValue, out codigo))
                    return;

                ddlLaboratorios.DataTextField = "Nome";
                ddlLaboratorios.DataValueField = "IdMedico";

                ddlLaboratorios.DataSource = new MedicoFacade().ListarPorTipo(IdTipoServico, codigo, ref resultado).OrderBy(x => x.Nome);
                ddlLaboratorios.DataBind();

                ddlLaboratorios.Items.Insert(0, "");
                ddlLaboratorios.Visible = true;
                lblLaboratorios.Visible = true;
            }
            else
            {
                ddlLaboratorios.Visible = false;
                lblLaboratorios.Visible = false;
            }
        }

        protected void ddlLaboratorios_OnSelectedIndexChanged(Object sender, EventArgs e)
        {
            if (ddlLaboratorios.SelectedValue != "")
            {

                int codigo;
                if (int.TryParse(ddlLaboratorios.SelectedValue, out codigo))
                    IdMedico = codigo;
                else
                    return;

                PreencheGrid();

                lblExames.Visible = true;
                gvExames.Visible = true;
            }
            else
            {
                lblExames.Visible = false;
                gvExames.Visible = false;
            }
        }

        protected void gvExames_Sorting(object sender, GridViewSortEventArgs e)
        {
            if (sortExpression != e.SortExpression)
                sortDirection = 1; //ASC
            else
                sortDirection *= -1; //DESC

            sortExpression = e.SortExpression;
            PreencheGrid();
        }

        protected void gvExames_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            //switch (e.CommandName)
            //{
            //    case "Comprar":
            //        this.IdMedico = Convert.ToInt32(gvExames.DataKeys[int.Parse(e.CommandArgument.ToString())]["IdMedico"].ToString());
            //        Server.Transfer("ComprarConsultaResumo.aspx", false);
            //        break;
            //    default:
            //        break;
            //}
        }

        protected void gvExames_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            try
            {
                if (e.Row.RowType == DataControlRowType.DataRow)
                {

                    HiddenField hdfidServico_medico = e.Row.FindControl("hdfidServico_medico") as HiddenField;
                    hdfidServico_medico.Value = ((Servico_MedicoEntities)(e.Row.DataItem)).idServico_medico.ToString();

                    //((ScriptManager)Master.FindControl("ScriptManager1")).RegisterPostBackControl(lnkComprar);

                    ////lnkComprar.OnClientClick = "return confirm('Comprar consulta com o(a) Dr(a) " + ((MedicoEntities)e.Row.DataItem).Nome + "?');";
                    //lnkComprar.CommandName = "Comprar";
                    //lnkComprar.ToolTip = "Clique aqui para comprar uma consulta.";
                }
            }
            catch
            { }
        }

        protected void gvExames_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            gvExames.PageIndex = e.NewPageIndex;
            PreencheGrid();
        }

        private void OrdenarLista(ref List<Servico_MedicoEntities> listaMedico)
        {
            listaMedico.Sort(delegate(Servico_MedicoEntities a1, Servico_MedicoEntities a2)
            {
                Type t = typeof(Servico_MedicoEntities);
                PropertyInfo prop = t.GetProperty(sortExpression);
                object u1Value = prop.GetValue(a1, null);
                object u2Value = prop.GetValue(a2, null);
                return ((IComparable)u1Value).CompareTo(((IComparable)u2Value)) * sortDirection;
            });
        }

        private void PreencheGrid()
        {
            Resultado resultado = new Resultado();
            Servico_MedicoEntities filtro = new Servico_MedicoEntities();

            filtro.idMedico = IdMedico;

            List<Servico_MedicoEntities> listaExames = new Servico_MedicoFacade().Listar(filtro, ref resultado);

            if (resultado.Sucesso)
            {
                ((Label)Master.FindControl("lblMensagem")).Visible = false;
                OrdenarLista(ref listaExames);
                gvExames.DataSource = listaExames;
                gvExames.DataBind();
                gvExames.Visible = true;
            }
            else
            {
                gvExames.Visible = false;
                ((Label)Master.FindControl("lblMensagem")).Text = resultado.Mensagens[0].Descricoes[0];
                ((Label)Master.FindControl("lblMensagem")).CssClass = "mensagem-vermelho";
                ((Label)Master.FindControl("lblMensagem")).Visible = true;
            }
        }

        protected void btnVoltar_Click(object sender, EventArgs e)
        {
            Response.Redirect("~/Compras/Comprar.aspx", false);
        }

        protected void btnComprar_Click(object sender, EventArgs e)
        {
            ValorTotal = 0;
            Servicos = new List<Servico_MedicoEntities>();

            foreach (GridViewRow row in gvExames.Rows)
            {
                CheckBox ch = (CheckBox)row.FindControl("chkMarcar");
                HiddenField hdf = (HiddenField)row.FindControl("hdfidServico_medico");
                if (hdf != null)
                {
                    if (ch != null)
                    {
                        if (ch.Checked)
                        {
                            Servico_MedicoEntities obj = new Servico_MedicoEntities();
                            obj = new Servico_MedicoFacade().GetServico_Medico(int.Parse(hdf.Value));
                            Servicos.Add(obj);
                            ValorTotal += obj.PrecoVenda;   
                        }
                    }
                }
            }

            //Server.Execute("ComprarExameResumo.aspx");
            Response.Redirect("ComprarExameResumo.aspx");
        }
    }
}